﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using CityGames;

namespace CityGamesWeb
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        static private Juego juego = new Juego();
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                CargarCarro();
            }
            catch (Exception)
            {
               
            }
        }

        protected void CargarCarro()
        {
            int num = 0;
            double subtotal = 0;
            double total = 0;

            try
            {
                if (Session["numeroJuegos"] != null)
                    num = (int)(Session["numeroJuegos"]);
                
                for (int i = 1; i <= num; i++)
                {
                    string nombre = Session["juego" + i.ToString()].ToString();
                    string plataforma = Session["plataforma" + i.ToString()].ToString();
                    string cantidad = Session["cantidad" + i.ToString()].ToString();
                    string tipo = Session["tipo" + i.ToString()].ToString();
                    Promocion promo = new Promocion();

                    string[] promocion;
                    string precio;
                    
                    //Crea la nueva Fila
                    TableRow fila = new TableRow();
                    TCarro.Rows.Add(fila);


                    //COLUMNA PRODUCTO
                    //Crea la celda del Producto
                    TableCell celdaProducto = new TableCell();
                    fila.Cells.Add(celdaProducto);
                    celdaProducto.Width = System.Web.UI.WebControls.Unit.Parse("50%");

                    HyperLink caratula = new HyperLink();
                    
                    caratula.Height = System.Web.UI.WebControls.Unit.Parse("150px");
                    caratula.ID = "Caratula" + i.ToString();
                    caratula.NavigateUrl = "Juego.aspx?juego=" + Server.UrlEncode(nombre) + "&plataforma=" + Server.UrlEncode(plataforma);
                    
                    Image caratulaImagen = new Image();
                    caratulaImagen.ImageUrl = ConvertirDireccionImagen(juego.GetCaratula(nombre, plataforma));
                    caratulaImagen.Height = System.Web.UI.WebControls.Unit.Parse("150px");
                    
                    caratula.Controls.Add(caratulaImagen);

                    


                    celdaProducto.Controls.Add(caratula);

                    HyperLink NombreJuego = new HyperLink();
                    NombreJuego.Text = nombre + '(' + plataforma + ')';
                    NombreJuego.ID = "Nombre" + i.ToString();
                    NombreJuego.NavigateUrl = "Juego.aspx?juego=" + Server.UrlEncode(nombre) + "&plataforma=" + Server.UrlEncode(plataforma);
                    celdaProducto.Controls.Add(NombreJuego);



                    if (tipo == "segunda")
                    {
                        Label segundaMano = new Label();
                        segundaMano.Text = "(Segunda Mano)";
                        celdaProducto.Controls.Add(segundaMano);
                    }


                    //COLUMNA CANTIDAD
                    //Crea la celda del Cantidad
                    TableCell celdaCantidad = new TableCell();
                    fila.Cells.Add(celdaCantidad);
                    celdaCantidad.Width = System.Web.UI.WebControls.Unit.Parse("5%");
                    celdaCantidad.HorizontalAlign = System.Web.UI.WebControls.HorizontalAlign.Center;
                    celdaCantidad.ID = "CeldaCantidad" + i.ToString();

                    TextBox TBcantidad = new TextBox();
                    TBcantidad.Text = cantidad;
                    TBcantidad.Width = System.Web.UI.WebControls.Unit.Parse("100%");
                    TBcantidad.ID = "Cantidad" + i.ToString();
                    TBcantidad.ValidationGroup = "Carrito";
                    TBcantidad.CausesValidation = true;
                    celdaCantidad.Controls.Add(TBcantidad);

                    RegularExpressionValidator regExValidatorCantidad = new RegularExpressionValidator();
                    regExValidatorCantidad.ControlToValidate = "Cantidad" + i.ToString();
                    regExValidatorCantidad.ValidationExpression = @"^\d+$";
                    regExValidatorCantidad.ValidationGroup = "Carrito";
                    regExValidatorCantidad.ErrorMessage = "Debes introducir un número";
                    celdaCantidad.Controls.Add(regExValidatorCantidad);


                    //COLUMNA DESCUENTO
                    //Crea la celda del Promocion
                    TableCell celdaPromocion = new TableCell();
                    fila.Cells.Add(celdaPromocion);
                    celdaPromocion.Width = System.Web.UI.WebControls.Unit.Parse("20%");
                    celdaPromocion.HorizontalAlign = System.Web.UI.WebControls.HorizontalAlign.Center;
                    //celdaPromocion.Text = "Ninguna";
                    promocion = promo.GetTipoPromocion(nombre, plataforma);


                    //COLUMNA Precio
                    //Crea la celda del Precio
                    TableCell celdaPrecio = new TableCell();
                    fila.Cells.Add(celdaPrecio);
                    celdaPrecio.Width = System.Web.UI.WebControls.Unit.Parse("10%");
                    celdaPrecio.HorizontalAlign = System.Web.UI.WebControls.HorizontalAlign.Center;
                    celdaPrecio.ID = "Precio" + i.ToString();

                    precio = juego.GetPrecio(nombre, plataforma, tipo);
                    

                    //COLUMNA Total
                    //Crea la celda del Total
                    TableCell celdaSubTotal = new TableCell();
                    fila.Cells.Add(celdaSubTotal);
                    celdaSubTotal.Width = System.Web.UI.WebControls.Unit.Parse("10%");
                    celdaSubTotal.HorizontalAlign = System.Web.UI.WebControls.HorizontalAlign.Center;

        

                    if(promocion[0] == "2X1")
                    {
                        celdaPromocion.Text = promocion[0];
                        celdaPrecio.Text = precio + " €";
                        int cantidadRed = int.Parse(cantidad)/2;
                        if (double.Parse(cantidad) % 2 > 0)
                            cantidadRed++;
                        subtotal = cantidadRed*double.Parse(precio);
                    }
                    else if (promocion[0] == "Descuento en €")
                    {
                        celdaPromocion.Text = "Descuento de " + promocion[1] + " €.";

                        Label precioAnt = new Label();
                        precioAnt.Text = precio + " €<br>";
                        precioAnt.Font.Strikeout = true;
                        celdaPrecio.Controls.Add(precioAnt);

                        double precioConPromo = 0;
                        if (double.Parse(promocion[1]) < double.Parse(precio))
                            precioConPromo = double.Parse(precio) - double.Parse(promocion[1]);
                        Label precioNew = new Label();
                        precioNew.Text = precioConPromo.ToString() + " €";
                        celdaPrecio.Controls.Add(precioNew);

                        subtotal = (precioConPromo * int.Parse(cantidad));
                    }
                    else if (promocion[0] == "Descuento en %")
                    {
                        celdaPromocion.Text = "Descuento de " + promocion[1] + " %.";

                        Label precioAnt = new Label();
                        precioAnt.Text = precio + " €<br>";
                        precioAnt.Font.Strikeout = true;
                        celdaPrecio.Controls.Add(precioAnt);

                        double precioConPromo = 0;
                        precioConPromo = double.Parse(precio) * (1 - (double.Parse(promocion[1]) / 100));
                        Label precioNew = new Label();
                        precioNew.Text = precioConPromo.ToString() + " €";
                        celdaPrecio.Controls.Add(precioNew);

                        subtotal = (precioConPromo * int.Parse(cantidad));

                    }
                    else
                    {
                        celdaPromocion.Text = "Ninguna";
                        celdaPrecio.Text = precio;
                        subtotal = (double.Parse(precio) * int.Parse(cantidad));
                    }
                    //subtotal = double.Parse(juego.GetPrecio(nombre, plataforma, tipo).ToString()) * double.Parse(cantidad);
                    total += subtotal;

                    celdaSubTotal.Text = subtotal.ToString() + " €";
                    celdaSubTotal.ID = "SubTotal" + i.ToString();


                    //COLUMNA Borrar
                    //Crea la celda del Borrar
                    TableCell celdaBorrar = new TableCell();
                    fila.Cells.Add(celdaBorrar);
                    celdaBorrar.Width = System.Web.UI.WebControls.Unit.Parse("5%");
                    celdaBorrar.HorizontalAlign = System.Web.UI.WebControls.HorizontalAlign.Center;

                    ImageButton borrar = new ImageButton();
                    borrar.ImageUrl = "~/Imagenes/delete-icon.png";
                    borrar.Height = System.Web.UI.WebControls.Unit.Parse("25px");
                    borrar.ID = "Borrar" + i.ToString();
                    borrar.Click += new ImageClickEventHandler(Borrar);
                    borrar.ValidationGroup = "Carrito";
                    celdaBorrar.Controls.Add(borrar);

                    AjaxControlToolkit.ConfirmButtonExtender confirmacion = new AjaxControlToolkit.ConfirmButtonExtender();
                    confirmacion.TargetControlID = "Borrar" + i.ToString();
                    confirmacion.ConfirmText = "¿Está seguro de que desea borrar el juego?";
                    celdaCantidad.Controls.Add(confirmacion);
                }
                
                if (num == 0)
                {
                    //Crea la nueva Fila
                    TableRow fila = new TableRow();
                    TCarro.Rows.Add(fila);

                    TableCell celda = new TableCell();
                    fila.Cells.Add(celda);
                    celda.Text = "El carrito está vacio";
                }

                //Crea la nueva Fila para el total
                TableRow filaTotal = new TableRow();
                TCarro.Rows.Add(filaTotal);

                for (int i = 0; i < 3; i++)
                {
                    TableCell celdaVacia = new TableCell();
                    filaTotal.Cells.Add(celdaVacia);
                }
                TableCell celdaTotalTexto = new TableCell();
                filaTotal.Cells.Add(celdaTotalTexto);
                celdaTotalTexto.HorizontalAlign = System.Web.UI.WebControls.HorizontalAlign.Right;
                celdaTotalTexto.Text = "Total";

                TableCell celdaTotal = new TableCell();
                filaTotal.Cells.Add(celdaTotal);
                celdaTotal.HorizontalAlign = System.Web.UI.WebControls.HorizontalAlign.Center;
                celdaTotal.Text = total.ToString() + " €";
            }
            catch (Exception)
            {
             
            }
        }

        protected void Borrar(object sender, ImageClickEventArgs e)
        {
            ImageButton imgBtn = (ImageButton)sender;
            try
            {
                int id = int.Parse(imgBtn.ID[6].ToString());

                Borrar(id);

                Response.Redirect(Request.RawUrl);
            }
            catch (Exception)
            {
              
            }

        }

        protected void Borrar(int id)
        {
            int num = 0;
            CarroSocio carro = new CarroSocio();
            string juego = "";
            string plataforma = "";
            string tipo = "";

            try
            {
                if (Session["numeroJuegos"] != null)
                    num = (int)(Session["numeroJuegos"]);

                juego = Session["juego" + id.ToString()].ToString();
                plataforma = Session["plataforma" + id.ToString()].ToString();
                tipo = Session["tipo" + id.ToString()].ToString();

                if (Session["usuario"] != null)
                    carro.BorrarJuego(Session["usuario"].ToString(), juego, plataforma, tipo);

                for (int i = id; i < num; i++)
                {
                    Session["juego" + i.ToString()] = Session["juego" + (i + 1).ToString()];
                    Session["plataforma" + i.ToString()] = Session["plataforma" + (i + 1).ToString()];
                    Session["cantidad" + i.ToString()] = Session["cantidad" + (i + 1).ToString()];
                    Session["tipo" + i.ToString()] = Session["tipo" + (i + 1).ToString()];
                }

                Application.Remove("juego" + num.ToString());
                Application.Remove("plataforma" + num.ToString());
                Application.Remove("cantidad" + num.ToString());
                Application.Remove("tipo" + num.ToString());

                Session["numeroJuegos"] = num - 1;
            }
            catch (Exception)
            {
            
            }
        }

        protected void Actualizar(object sender, ImageClickEventArgs e)
        {
            TextBox cantidad;
            string nombre = "", plataforma = "", tipo = ""; 
            int num = 0;
            int numeroCopias = 0;
            CarroSocio carroSocio = new CarroSocio();

            try
            {
                if (Session["numeroJuegos"] != null)
                    num = (int)(Session["numeroJuegos"]);

                for (int i = 1; i <= num; i++)
                {
                    nombre = Session["juego" + i.ToString()].ToString();
                    plataforma = Session["plataforma" + i.ToString()].ToString();
                    tipo = Session["tipo" + i.ToString()].ToString();

                    cantidad = (TextBox)TCarro.FindControl("Cantidad" + i);
                    
                        if (EsCero(cantidad.Text))
                            Borrar(i);
                        else
                        {
                            numeroCopias = NumeroDeCopias(nombre, plataforma, tipo);
                            if (numeroCopias < int.Parse(cantidad.Text))
                            {
                                Session["cantidad" + i.ToString()] = numeroCopias.ToString();
                                if (Session["usuario"] != null)
                                    carroSocio.ModificarCantidad(Session["usuario"].ToString(), nombre, plataforma, tipo, numeroCopias.ToString());
                            }
                            else
                            {
                                Session["cantidad" + i.ToString()] = cantidad.Text;
                                if (Session["usuario"] != null)
                                    carroSocio.ModificarCantidad(Session["usuario"].ToString(), nombre, plataforma, tipo, cantidad.Text);
                            }
                        }
                    
                }
                Response.Redirect(Request.RawUrl);
            }
            catch (Exception)
            {
            
            }
        }

        protected bool EsNumero(string cadena)
        {
            bool ok = true;

            try
            {
                foreach (char car in cadena)
                {
                    if (car < '0' || car > '9')
                        ok = false;
                }
            }
            catch (Exception)
            {
            
            }
            return ok;
        }

        protected bool EsCero(string cadena)
        {
            bool ok = true;

            try
            {
                foreach (char car in cadena)
                {
                    if (car != '0')
                        ok = false;
                }
            }
            catch (Exception)
            {
                
            }
            return ok;
        }

        private int NumeroDeCopias(string nombre, string plataforma, string tipo)
        {
            int numeroCopias = 0;
            CopiaFisica copiaFisica = new CopiaFisica();

            try
            {
                if (tipo == "nuevo")                                             //SI EL JUEGO ES NUEVO
                    numeroCopias = copiaFisica.NumeroCopiasFisicasNuevas(nombre, plataforma);

                else if (tipo == "segunda")                                     //SI EL JUEGO ES DE SEGUNDA MANO
                    numeroCopias = copiaFisica.NumeroCopiasFisicasSegundaMano(nombre, plataforma);
            }
            catch (Exception)
            {
             
            }
            return numeroCopias;
        }

        protected void Procesar(object sender, ImageClickEventArgs e)
        {
            int num = 0;

            if (Session["numeroJuegos"] != null)
                num = (int)(Session["numeroJuegos"]);

            if (num > 0)
            {
                if (Session["usuario"] == null)     //Si no esta logueado
                {
                    Response.Redirect("Carro2.aspx");
                }
                else
                {
                    Response.Redirect("Carro3.aspx");
                }
            }
            else
            {
                MyMessageBoxInfo.Show(MyMessageBox.MessageType.Info, "No hay productos en el carro","Carro vacio",120,200);
            }

        }

        private string ConvertirDireccionImagen(string imagen)
        {
            string resultado = @"Caratulas/";

            if (imagen != "")
            {
                string[] campos = imagen.Split('\\');
                resultado += campos[campos.Length - 1];
            }
            else
                resultado += "caratula_no_disponible.gif";

            return resultado;
        }

    }
}